package com.tedu.weibo.common.exception;

import com.tedu.weibo.common.result.JsonResult;
import com.tedu.weibo.common.result.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

/**
 * 如果希望SpringMVC将当前类作为一个全局异常处理器使用
 * 那么这个类上需要标注注解
 * @ControllerAdvice
 *
 * @ResponseBody//方法上使用注解
 * @RestControllerAdvice//类上使用注解
 * 全局异常处理器后需要给前端浏览器返回一个json数据，那么有两种方式：
 * 1. 在方法上使用@ResponseBody注解
 * 2. 在类上使用@RestControllerAdvice注解
 *
 * 程序出现异常需要使用日志记录，方便我们定位问题
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler
    public JsonResult doHandleRuntimeException(RuntimeException e){
        log.error(e.getMessage(),e);// 记录日志
        System.out.println("处理RuntimeException! ! !");
        return new JsonResult(StatusCode.OPERATION_FAILED);
    }

    @ExceptionHandler
    public JsonResult doHandIllegalArgumentException(IllegalArgumentException e){
        System.out.println("处理IllegalArgumentException! ! !");
        log.error(e.getMessage(),e);
        return new JsonResult(StatusCode.OPERATION_FAILED);
    }

    @ExceptionHandler
    public JsonResult doHandMethodArgumentNotValidException(MethodArgumentNotValidException e){
        /*System.out.println("message:"+e.getFieldError().getDefaultMessage());//获取错误信息，可记为固定格式
        System.out.println("处理MethodArgumentNotValidException! ! !");*/
        String message = e.getFieldError().getDefaultMessage();
        log.error(message,e);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }
    @ExceptionHandler
    public JsonResult doHandConstraintViolationException(ConstraintViolationException e){
        String message = e.getMessage();
        message= message.substring(message.indexOf(":")+1).trim();
        log.error(message,e);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }


    //doHandThrowable该方法用于兜底操作，用户端不会出现500错误（服务端错误）
    @ExceptionHandler
    public JsonResult doHandThrowable(Throwable e){
        log.error(e.getMessage(),e);
        return new JsonResult(StatusCode.UNKNOWN_ERROR);
    }




}
